home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Gekikoh Dennoh Club 5
/
Gekikoh Dennoh Club Vol. 5 (Japan).7z
/
Gekikoh Dennoh Club Vol. 5 (Japan) (Track 01).bin
/
internet
/
webx
/
webxp040.lzh
/
Source
/
FuncUrl
/
FuncUrl.c
next >
Wrap
C/C++ Source or Header
|
1998-07-25
|
4KB
|
199 lines
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/* URL é≡ scheme/hostname/path/fname/query/port/anchor é╔ò¬ë≡é╖éΘ */
int UrlSplit (char *url,
char *scheme, char *hostname, char *path, char *fname, char *query, char *anchor,
int *port)
{
char c, *s = url, *d = NULL;
char *last_fname, *last_slash, *last_query = NULL, *last_anchor = NULL;
char *scheme_str[]=
{"http://", "file://"};
short h;
*query = '\0';
*anchor = '\0';
/* scheme é╔éµé┴é─ò¬è≥ */
for (h = 0; h < sizeof (scheme_str) / sizeof (char *); h++) {
if (!strnicmp (s, scheme_str[h], strlen (scheme_str[h])))
break;
}
switch (h) {
case 0: /* http:// */
strcpy (scheme, "http://"); /* âfâtâHâïâgé═ HTTP */
*port = 80;
s += 7;
d = hostname;
while ((*d++ = *s++) != '/');
*(d - 1) = '\0';
d = path;
*d++ = '/';
break;
case 1: /* file:// */
strcpy (scheme, "file://");
s += 7;
*port = 0; /* ë╝é╔é▒éñé╡é╞é¡ */
*hostname = '\0';
d = path;
break;
#if 0
case 2: /* ftp:// */
strcpy (scheme, "ftp://");
s += 6;
*port = 20;
d = hostname;
while ((*d++ = *s++) != '/');
*(d - 1) = '\0';
d = path;
*d++ = '/';
break;
#endif
default:
strcpy (scheme, "file://");
*port = 0; /* ë╝é╔é▒éñé╡é╞é¡ */
*hostname = '\0';
d = path;
break;
}
last_fname = s; /* ì┼îπé╠ '/' é╠ăé╠âAâhâîâXé≡ò█Ä¥üiâRâsü[î│üj */
last_slash = d; /* ì┼îπé╠ '/' é╠ăé╠âAâhâîâXé≡ò█Ä¥üiâRâsü[ɵüj */
for (;;) {
c = *d++ = *s++;
if (c == '\0') {
if (last_query != NULL) {
memcpy (fname, last_fname, last_query - last_fname);
strcpy (query, last_query);
*(fname + (last_query - last_fname)) = '\0';
} else {
if (last_anchor != NULL) {
memcpy (fname, last_fname, last_anchor - last_fname);
strcpy (anchor, last_anchor);
*(fname + (last_anchor - last_fname)) = '\0';
} else {
strcpy (fname, last_fname);
}
}
*last_slash = '\0';
break;
}
if (c == '/') {
last_fname = s;
last_slash = d;
}
if (c == '?')
last_query = s - 1;
if (c == '#')
last_anchor = s - 1;
}
return (0);
}
/* ùvæfé⌐éτîïìçé╡é─ URL é≡É╢ɼé╖éΘ "./" éΓ "../" éαé╡é┴é⌐éΦÅêù¥é╖éΘ */
/* ÆAé╡ fname= "http://ü`" é╛é┴é╜ÅΩìçüAîïìçé╣é╕ url=fname é╞é╖éΘ */
void UrlCat (char *url, /* ò╘éΦÆl */
char *scheme, char *hostname, char *path, char *fname, char *query, char *anchor,
int port)
{
char *p = fname, *q;
char c;
char *last_dir, *last_dir2;
/* ÉΓæ╬âpâXÄwÆΦé╛é┴é╜ÅΩìç */
if (!strnicmp (fname, "http://", 7)) {
strcpy (url, fname);
return;
}
if (!strnicmp (fname, "file://", 7)) {
strcpy (url, fname);
return;
}
/* ê╚ë║æèæ╬âpâXÄwÆΦé╠Åêù¥ */
strcpy (url, scheme);
if (!stricmp (scheme, "http://")) {
if (port == 80)
strcat (url, hostname);
else
sprintf (url, "http://%s:%d", hostname, port);
}
/* '/' é⌐éτÄné▄éΘâtâ@âCâïû╝é╛é┴é╜ÅΩìç */
if (!strncmp (fname, "/", 1)) {
strcat (url, fname);
strcat (url, query);
return;
}
strcat (url, path);
for (;;) {
if (!strncmp (p, "./", 2)) {
p += 2;
continue;
}
if (!strncmp (p, "../", 3)) {
p += 3;
q = last_dir = last_dir2 = url;
while (c = *q++) {
if (c == '/') {
last_dir2 = last_dir;
last_dir = q;
}
}
*last_dir2 = '\0';
continue;
}
break;
}
strcat (url, p);
strcat (url, query);
strcat (url, anchor);
}
#ifdef DEMO
int main (int argc, char *argv[])
{
char scheme[256], hostname[256], path[256], fname[256], query[256], anchor[256];
int port;
char url[256];
/* UrlSplit() é╠âfâé */
printf ("UrlSplit() é╠âfâé\n");
strcpy (url, "http://www.mankai.co.jp/denkura/123/index.htm#tools");
UrlSplit (url, scheme, hostname, path, fname, query, anchor, &port);
printf ("url = %s é≡ UrlSplit() é╡é▄é╖\n", url);
printf (" scheme = %s\n"
" hostname= %s\n"
" path = %s\n"
" fname = %s\n"
" query = %s\n"
" anchor = %s\n"
" port = %d\n\n", scheme, hostname, path, fname, query, anchor, port);
/* UrlCat() é╠âfâé */
printf ("UrlCat() é╠âfâé\n");
strcpy (fname, "../124/index.htm");
strcpy (query, "?=UrlFunc");
port = 1080;
printf (" scheme = %s\n"
" hostname= %s\n"
" path = %s\n"
" fname = %s\n"
" query = %s\n"
" anchor = %s\n"
" port = %d\n"
"é≡ UrlCat() é╡é▄é╖\n", scheme, hostname, path, fname, query, anchor, port);
UrlCat (url, scheme, hostname, path, fname, query, anchor, port);
printf ("url = %s\n", url);
return (0);
}
#endif